/*
 * @ : Copyright (c) 2021 Phytium Information Technology, Inc. 
 *  
 * SPDX-License-Identifier: Apache-2.0.
 * 
 * @Date: 2021-08-12 16:21:02
 * @LastEditTime: 2021-08-24 08:54:10
 * @Description:  This files is for 
 * 
 * @Modify History: 
 *  Ver   Who        Date         Changes
 * ----- ------     --------    --------------------------------------
 */
#ifndef BSP_DRIVERS_ETH_F_GMAC_HW_H
#define BSP_DRIVERS_ETH_F_GMAC_HW_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "kernel.h"
#include "ft_io.h"

/* Register Offset */
/****GMAC CTRL****/
#define GMAC_CONF_OFFSET 0x00U                   /* MAC 配置寄存器 */
#define GMAC_FRAME_FILTER_OFFSET 0x04U           /* Mac 帧过滤 */
#define GMAC_HASH_HIGH_OFFSET 0x08U              /* 哈希表高位寄存器 */
#define GMAC_HASH_LOW_OFFSET 0x0cU               /* 哈希表低位寄存器 */
#define GMAC_GMII_ADDR_OFFSET 0x10U              /* GMII 地址寄存器 */
#define GMAC_GMII_DATA_OFFSET 0x14U              /* GMII 数据寄存器 */
#define GMAC_FLOW_CTRL_OFFSET 0x18U              /* 流控寄存器 */
#define GMAC_VLAN_TAG_OFFSET 0x1cU               /* VLAN 标记寄存器 */
#define GMAC_VERSION_OFFSET 0x20U                /* 版本寄存器 */
#define GMAC_DEBUG_STATUS_OFFSET 0x24U           /* 调试寄存器 */
#define GMAC_LPI_CTRL_STATUS_OFFSET 0x30U        /* LPI (低功耗空闲) 控制和状态寄存器 */
#define GMAC_LPI_TIMER_CTRL_OFFSET 0x34U         /* LPI 定时器控制寄存器 */
#define GMAC_INTR_STATUS_OFFSET 0x38U             /* 中断状态寄存器 */
#define GMAC_INTR_MASK_OFFSET 0x3CU               /* 中断屏蔽寄存器 */
#define GMAC_MAC_ADDR0_UPPER16BIT_OFFSET 0x40U   /* 第一个 MAC 地址的高 16 位。 */
#define GMAC_MAC_ADDR0_LOWER32BIT_OFFSET 0x44U   /* 第一个 MAC 地址的低 32 位。。 */
#define GMAC_MAC_ADDR1_UPPER16BIT_OFFSET 0x48U   /* 第二个 MAC 地址的高 16 位。 */
#define GMAC_MAC_ADDR1_LOWER32BIT_OFFSET 0x4CU   /* 第二个 MAC 地址的低 32 位。。 */
#define GMAC_MAC_PHY_STATUS 0xD8U                /* MAC PHY 状态 */

/****GMAC DMA CTRL****/
#define GMAC_DMA_BUS_MODE_OFFSET 0x1000U           /* 总线模式寄存器 */
#define GMAC_DMA_TX_POLL_REQ_OFFSET 0x1004U        /* 发送轮询请求寄存器 */
#define GMAC_DMA_RX_POLL_REQ_OFFSET 0x1008U        /* 接收轮询请求寄存器 */
#define GMAC_DMA_RX_LIST_BASE_OFFSET 0x100cU       /* 接收描述符列表地址寄存器 */
#define GMAC_DMA_TX_LIST_BASE_OFFSET 0x1010U       /* 发送描述符列表地址寄存器 */
#define GMAC_DMA_STATUS_OFFSET 0x1014U             /* 状态寄存器 */
#define GMAC_DMA_OP_OFFSET 0x1018U                 /* 操作模式寄存器 */
#define GMAC_DMA_INTR_OFFSET 0x101cU            /* 中断使能寄存器 */
#define GMAC_DMA_MISSED_FRAME_CNT_OFFSET 0x1020U   /* 丢帧和缓冲区溢出计数器寄存器 */
#define GMAC_DMA_RX_WATCHDOG_OFFSET 0x1024U        /* 接收中断看门狗定时器寄存器 */
#define GMAC_DMA_AXI_BUS_MOD_OFFSET 0x1028U        /* AXI 总线模式寄存器*/
#define GMAC_DMA_AXI_BUS_STATUS_OFFSET 0x102CU     /* AXI 状态寄存器 */
#define GMAC_DMA_HOST_TX_DESC_OFFSET 0x1048U       /* 当前主机发送描述符寄存器 */
#define GMAC_DMA_HOST_RX_DESC_OFFSET 0x104CU       /* 当前主机接收描述符寄存器 */
#define GMAC_DMA_HOST_TX_BUF_ADDR_OFFSET 0x1050U   /* 当前主机发送缓冲地址寄存器 */
#define GMAC_DMA_HOST_RX_BUF_ADDR_OFFSET 0x1054U   /* 当前主机接收缓冲地址寄存器 */
#define GMAC_DMA_HW_FUNC_OFFSET   0x1058U          /* 硬件功能寄存器 */

/****************GMAC Ctrl Register*******************/
/* MAC configuration register definitions */
#define GMAC_CONF_RX_EN		       BIT(2) //接收器启用
#define GMAC_CONF_TX_EN		       BIT(3) //发送器启用
#define GMAC_CONF_DC               BIT(4) //延期检查
#define GMAC_CONF_BL_MASK          GENMASK(6, 5) //后退限制
#define GMAC_CONF_BL(x)            (GMAC_CONF_BL_MASK & ((x) << 5))
#define GMAC_CONF_ACS              BIT(7) //自动 PAD/ CRC 剥线
#define GMAC_CONF_LINK_UPDOWN      BIT(8) //链接 up/down
#define GMAC_CONF_DISABLE_RETRY    BIT(9) //禁用重试
#define GMAC_CONF_IPC              BIT(10) //校验和卸载
#define GMAC_CONF_DUPLEX_MODE      BIT(11) //双工模式
#define GMAC_CONF_LOOPBACK_MODE    BIT(12) //环回模式
#define GMAC_CONF_DO               BIT(13) //不能自接收
#define GMAC_CONF_FES              BIT(14) //速度选择 1: 10Mbps, 0: 100Mbps
#define GMAC_CONF_PORTSELECT       BIT(15) //端口选择 0: GMII（1000Mbps）1: MII(10/100Mbps)
#define GMAC_CONF_DCRS             BIT(16) //传输过程中禁用载波侦听
#define GMAC_CONF_IFG_MASK         GENMASK(19, 17) //帧内间隔
#define GMAC_CONF_IFG(x)           (GMAC_CONF_IFG_MASK & ((x) << 17))
#define GMAC_CONF_JE               BIT(20) // 使用Jumbo帧
#define GMAC_CONF_BE               BIT(21) // 帧突发启用
#define GMAC_CONF_JD               BIT(22) // Jabber 禁用
#define GMAC_CONF_WD               BIT(23) // 看门狗禁用
#define GMAC_CONF_TC               BIT(24) // 在 RGMII 中传输配置
#define GMAC_CONF_CST              BIT(25) // 类型帧的 CRC 剥离

#define GMAC_CONF_INIT  (GMAC_CONF_DO | GMAC_CONF_JD | GMAC_CONF_ACS | GMAC_CONF_IPC | \
                         GMAC_CONF_BE | GMAC_CONF_DUPLEX_MODE | GMAC_CONF_WD | GMAC_CONF_CST)

/** Mac 帧过滤 **/
#define GMAC_FRAME_FILTER_PR           BIT(0)
#define GMAC_FRAME_FILTER_HUC          BIT(1)  //哈希单播
#define GMAC_FRAME_FILTER_HMC          BIT(2)  //哈希多播
#define GMAC_FRAME_FILTER_DAIF         BIT(3)  //目的地址反向过滤
#define GMAC_FRAME_FILTER_PM           BIT(4)  //通过所有多播
#define GMAC_FRAME_FILTER_DBF          BIT(5)  //禁用广播帧
#define GMAC_FRAME_FILTER_PCF_MASK     (GENMASK(7, 6))  //通过控制帧
#define GMAC_FRAME_FILTER_PCF(x)       ((x) << 6)
#define GMAC_FRAME_FILTER_SAIF         BIT(8)   //源地址反相过滤
#define GMAC_FRAME_FILTER_SAF          BIT(9)   //源地址过滤使能
#define GMAC_FRAME_FILTER_HPF          BIT(10)  //hash 或 perfect 过滤器
#define GMAC_FRAME_FILTER_RA           BIT(31)  //全部接收

/**  哈希表高位寄存器 **/
#define GMAC_HASH_HIGH_HTH_MASK        GENMASK(31, 0) /* 该字段包含 Hash 表的高 32 位。 */

/** 哈希表低位寄存器 **/
#define GMAC_HASH_LOW_HTH_MASK         GENMASK(31, 0) /* 该字段包含 Hash 表的低 32 位。 */

/** GMII 地址寄存器  **/
#define GMAC_MII_ADDR_GB               BIT(0) //GMII 忙
#define GMAC_MII_ADDR_GW               BIT(1) //GMII 写
#define GMAC_MII_ADDR_CR_MASK          GENMASK(5, 2) //CSR 时钟范围
#define GMAC_MII_ADDR_CR(x)            (GMAC_MII_ADDR_CR_MASK & ((x) << 2))
enum
{
    GMAC_MII_ADDR_CR_60_100MHZ   =  (0b0000),
    GMAC_MII_ADDR_CR_100_150MHZ  =  (0b0001),
    GMAC_MII_ADDR_CR_23_35MHZ    =  (0b0010),
    GMAC_MII_ADDR_CR_35_60MHZ    =  (0b0011),
    GMAC_MII_ADDR_CR_150_250MHZ  =  (0b0100),
    GMAC_MII_ADDR_CR_250_300MHZ  =  (0b0101)
};

#define GMAC_MII_ADDR_GR_MASK          GENMASK(10, 6) //GMII 寄存器
#define GMAC_MII_ADDR_GR(x)            (GMAC_MII_ADDR_GR_MASK & ((x) << 6))
#define GMAC_MII_ADDR_PA_MASK          GENMASK(15, 11) //物理层地址
#define GMAC_MII_ADDR_PA(x)            (GMAC_MII_ADDR_PA_MASK & ((x) << 11))

/** GMII 数据寄存器  **/
#define GMAC_MII_DATA_GD_MASK          GENMASK(15, 0)

/**  流控寄存器 **/
#define GMAC_FLOW_FCB                  BIT(0)
#define GMAC_FLOW_BPA                  BIT(0)
#define GMAC_FLOW_TFE                  BIT(1)
#define GMAC_FLOW_RFE                  BIT(2) //接收流控制启用
#define GMAC_FLOW_UP                   BIT(3) //单播暂停帧检测
#define GMAC_FLOW_PLT_MASK             GENMASK(5, 4) //暂停低阈值
#define GMAC_FLOW_PLT(x)               ((x) << 3)
#define GMAC_FLOW_DZPQ                 BIT(7)
#define GMAC_FLOW_PT_MASK              GENMASK(31, 16) //暂停时间

/** VLAN 标记寄存器 **/
#define GMAC_VLAN_TAG_VL_MASK          GENMASK(15, 0) //启用 12 位 VLAN 标记比较
#define GMAC_VLAN_TAG_VL(x)            (GMAC_VLAN_TAG_VL_MASK & ((x) << 15))
#define GMAC_VLAN_TAG_ETV              BIT(16) //接收帧的 VLAN 标记标识符

/** 版本寄存器 **/
#define GMAC_VERSION_UDV_MASK          GENMASK(15, 8) /* 用户定义版本号 */
#define GMAC_VERSION_SDV_MASK          GENMASK(7, 0) /* 硬件定议版本号 */

/** LPI 控制和状态寄存器 **/
#define GMAC_LPI_CTRL_STATS_TLPIEN      BIT(0) //发送 LPI 进入
#define GMAC_LPI_CTRL_STATS_TLPIEX      BIT(1) //发送 LPI 退出
#define GMAC_LPI_CTRL_STATS_RLPIEN      BIT(2) //接收 LPI 进入
#define GMAC_LPI_CTRL_STATS_RLPIEX      BIT(3) //接收 LPI 退出
#define GMAC_LPI_CTRL_STATS_TLPIST      BIT(8) //发送 LPI 状态
#define GMAC_LPI_CTRL_STATS_RLPIST      BIT(9)  //接收 LPI 状态
#define GMAC_LPI_CTRL_STATS_LPIEN       BIT(16) //LPI 使能
#define GMAC_LPI_CTRL_STATS_PLS         BIT(17) //PHY 链路状态
#define GMAC_LPI_CTRL_STATS_PLSEN       BIT(18) //物理链路状态使能
#define GMAC_LPI_CTRL_STATS_LPITXA      BIT(19) //LPI 发送自动化

/**  LPI 定时器控制寄存器 **/
#define GMAC_LPI_TIMER_TWT_MASK        GENMASK(15, 0)
#define GMAC_LPI_TIMER_LIT_MASK        GENMASK(25, 16)

/** 中断状态寄存器 **/
#define GMAC_ISR_STATUS_RSIS            BIT(0) //RGMII/SMII Interrupt Status
#define GMAC_ISR_STATUS_PCSLSC          BIT(1) //PCS 链路状态改变
#define GMAC_ISR_STATUS_PCSANC          BIT(2) //PCS 自协商完成
#define GMAC_ISR_STATUS_PMTIS           BIT(3) 
#define GMAC_ISR_STATUS_MMCIS           BIT(4)
#define GMAC_ISR_STATUS_MMCRIS          BIT(5)  //MMC 接收中断状态
#define GMAC_ISR_STATUS_MMCTIS          BIT(6)  //MMC 发送中断状态
#define GMAC_ISR_STATUS_MMCRCOIS        BIT(7)  //接收校验和卸载中断状态
#define GMAC_ISR_STATUS_TIS             BIT(9)  //时间戳中断状态
#define GMAC_ISR_STATUS_LPIIS           BIT(10) //LPI 中断状态

/** 中断屏蔽寄存器  **/
#define GMAC_ISR_MASK_RSIM             BIT(0) /* RGMII/SMII 中断屏蔽 */
#define GMAC_ISR_MASK_PCSLSIM          BIT(1) //PCS 链路状态中断屏蔽
#define GMAC_ISR_MASK_PCSANCIM         BIT(2) //PCS AN 完成中断屏蔽
#define GMAC_ISR_MASK_PMTIM            BIT(3) //PMT 中断屏蔽
#define GMAC_ISR_MASK_TIM              BIT(9) //时间戳中断屏蔽
#define GMAC_ISR_MASK_LPIIM            BIT(10) //LPI 中断屏蔽

#define GMAC_8BIT_ADDR                 GENMASK(7, 0)

/**  MAC 地址 0 高寄存器 **/
#define GMAC_MAC_ADDR0_UPPER16BIT_A    GENMASK(15, 0) //MAC 地址 0[47:32]

/** MAC 地址 0 低寄存器 **/
#define GMAC_MAC_ADDR0_LOWER32BIT_A  GENMASK(31, 0) //MAC 地址 0[31:0]

/**  MAC 地址 1 高寄存器 **/
#define GMAC_MAC_ADDR1_UPPER16BIT_A    GENMASK(15, 0) //MAC 地址 1[47:32]
#define GMAC_MAC_ADDR1_UPPER16BIT_MBC  GENMASK(29, 24)
#define GMAC_MAC_ADDR1_UPPER16BIT_SA   BIT(30)
#define GMAC_MAC_ADDR1_UPPER16BIT_AE   BIT(31)

/** MAC 地址 1 低寄存器 **/
#define GMAC_MAC_ADDR1_LOWER16BIT_A   GENMASK(31, 0) //MAC 地址 1[31:0]

/* SGMII/RGMII status register */
#define GMAC_RGSMIIIS_LNKMODE		BIT(0) //指示链路的当前操作模式
#define GMAC_RGSMIIIS_LNKMODE_HALF  (0b0 << 0)
#define GMAC_RGSMIIIS_LNKMODE_FULL  (0b1 << 0)
#define GMAC_RGSMIIIS_SPEED         GENMASK(2, 1)
#define GMAC_RGSMIIIS_SPEED_2_5MHZ  (0b00 << 1) // 链路速度 2.5MHz
#define GMAC_RGSMIIIS_SPEED_25MHZ   (0b01 << 1) // 25MHz
#define GMAC_RGSMIIIS_SPEED_125MHZ  (0b10 << 1) // 125MHz
#define GMAC_RGSMIIIS_LNKSTS		BIT(3)
#define GMAC_RGSMIIIS_LNKSTS_UP     (0b1 << 3)
#define GMAC_RGSMIIIS_LNKSTS_DOWN   (0b0 << 3)
#define GMAC_RGSMIIIS_JAB_TIMEOUT   BIT(4)
#define GMAC_RGSMIIIS_FALSECARDET	BIT(5)

/****************GMAC DMA Register*******************/
/* Bus mode register definitions */
#define GMAC_DMA_BUS_SWR           BIT(0) //软件复位
#define GMAC_DMA_BUS_DA            BIT(1) //设置 8xPBL 模式
#define GMAC_DMA_BUS_DSL_MASK      GENMASK(6, 2) //描述符跳跃长度      
#define GMAC_DMA_BUS_ATDS          BIT(7) //
#define GMAC_DMA_BUS_PBL_MASK      GENMASK(13, 8) //可编程突发长度
#define GMAC_DMA_BUS_PBL(x)        ((x) << 8)
enum
{
    GMAC_DMA_BUS_PBL_1  = 1,
    GMAC_DMA_BUS_PBL_2  = 2,
    GMAC_DMA_BUS_PBL_4  = 4,
    GMAC_DMA_BUS_PBL_8  = 8,
    GMAC_DMA_BUS_PBL_16  = 16,
    GMAC_DMA_BUS_PBL_32  = 32
};
#define GMAC_DMA_BUS_PR_MASK GENMASK(15, 14) //加权循环仲裁中的优先级比率
#define GMAC_DMA_BUS_PR(x)          ((x) << 14)
#define GMAC_DMA_BUS_FB            BIT(16) //固定突发
#define GMAC_DMA_BUS_RPBL_MASK     GENMASK(22, 17) //RxDMA 事务中要传输的最大节拍数
#define GMAC_DMA_BUS_RPBL(x)        ((x) << 17)
enum
{
    GMAC_DMA_BUS_RPBL_1  = 1,
    GMAC_DMA_BUS_RPBL_2  = 2,
    GMAC_DMA_BUS_RPBL_4  = 4,
    GMAC_DMA_BUS_RPBL_16  = 16,
    GMAC_DMA_BUS_RPBL_32  = 32
};
#define GMAC_DMA_BUS_USP           BIT(23)
#define GMAC_DMA_BUS_8XPBL         BIT(24)
#define GMAC_DMA_BUS_AAL           BIT(25)
#define GMAC_DMA_BUS_MB            BIT(26) //混合突发
#define GMAC_DMA_BUS_TXPR          BIT(27) //发送优先级
#define GMAC_DMA_BUS_PRWG          GENMASK(29, 18) //通道优先权重

#define GMAC_DMA_BUS_INIT          (GMAC_DMA_BUS_FB | GMAC_DMA_BUS_PBL(16) | GMAC_DMA_BUS_RPBL(16))

/* 这些位控制 RxDMA 和 TxDMA 之间的加权循环仲裁中的优先级比率, 
   GMAC_DMA_BUS_DA=1时有效 */
#define GMAC_DMA_BUS_PRIORXTX_41		(3 << 14) //4:1
#define GMAC_DMA_BUS_PRIORXTX_31		(2 << 14) //3:1
#define GMAC_DMA_BUS_PRIORXTX_21		(1 << 14) //2:1
#define GMAC_DMA_BUS_PRIORXTX_11		(0 << 14) //1:1

/** 发送轮询请求寄存器 **/
#define GMAC_DMA_XMT_POLL_DEMAND_TPD GENMASK(31, 0)

/** 发送轮询请求寄存器 **/
#define GMAC_DMA_RCV_POLL_DEMAND_RPD GENMASK(31, 0)

/** 接收描述符列表地址寄存器  **/
#define GMAC_DMA_RCV_BASE_ADDR_START_REC_LIST GENMASK(31, 4)

/** 发送描述符列表地址寄存器 **/
#define GMAC_DMA_TX_BASE_ADDR_START_TRA_LIST GENMASK(31, 4)

/** DMA Status register defines **/
#define GMAC_DMA_STATUS_GLPII               BIT(30)   /* GMAC LPI interrupt */
#define GMAC_DMA_STATUS_TTI                 BIT(29)   /* 时间戳触发中断 */
#define GMAC_DMA_STATUS_GPI                 BIT(28)   /* PMT interrupt */
#define GMAC_DMA_STATUS_GMI                 BIT(27)  /* MMC interrupt */
#define GMAC_DMA_STATUS_GLI                 BIT(26)  /* GMAC Line interface int */
#define GMAC_DMA_STATUS_EB_MASK             GENMASK(25, 23)     /* Error Bits Mask */
#define GMAC_DMA_STATUS_TS_MASK             GENMASK(22, 20)     /* Transmit Process State */
#define GMAC_DMA_STATUS_TS_STOPPED          (0b000 << 20)
#define GMAC_DMA_STATUS_TS_GET_DESC         (0b001 << 20)
#define GMAC_DMA_STATUS_TS_WAIT             (0b010 << 20)
#define GMAC_DMA_STATUS_TS_QUEUE            (0b011 << 20)
#define GMAC_DMA_STATUS_TS_PAUSE            (0b110 << 20)
#define GMAC_DMA_STATUS_TS_CLOSE_DESC       (0b111 << 20)
#define GMAC_DMA_STATUS_RS_MASK             GENMASK(19, 17)     /* Receive Process State */
#define GMAC_DMA_STATUS_NIS                 BIT(16)         /* Normal Interrupt Summary */
#define GMAC_DMA_STATUS_AIS                 BIT(15)         /* Abnormal Interrupt Summary */
#define GMAC_DMA_STATUS_ERI                 BIT(14)         /* Early Receive Interrupt */
#define GMAC_DMA_STATUS_FBI                 BIT(13)         /* Fatal Bus Error Interrupt */
#define GMAC_DMA_STATUS_ETI                 BIT(10)         /* Early Transmit Interrupt */
#define GMAC_DMA_STATUS_RWT                 BIT(9)         /* Receive Watchdog Timeout */
#define GMAC_DMA_STATUS_RPS                 BIT(8)         /* Receive Process Stopped */
#define GMAC_DMA_STATUS_RU                  BIT(7)          /* Receive Buffer Unavailable */
#define GMAC_DMA_STATUS_RI                  BIT(6)          /* Receive Interrupt */
#define GMAC_DMA_STATUS_UNF                 BIT(5)         /* Transmit Underflow */
#define GMAC_DMA_STATUS_OVF                 BIT(4)         /* Receive Overflow */
#define GMAC_DMA_STATUS_TJT                 BIT(3)         /* Transmit Jabber Timeout */
#define GMAC_DMA_STATUS_TU                  BIT(2)          /* Transmit Buffer Unavailable */
#define GMAC_DMA_STATUS_TPS                 BIT(1)         /* Transmit Process Stopped */
#define GMAC_DMA_STATUS_TI                  BIT(0)          /* Transmit Interrupt */

#define GMAC_DMA_STATUS_CLR_ABLE            GENMASK(16, 0)  /* BIT [16 : 0] write 1 to clear */

/* Operation mode definitions */
#define GMAC_DMA_OP_DT                      BIT(26)    /* No Dropping of TCP/IP csum Err Frame */
#define GMAC_DMA_OP_RSF                     BIT(25)    /* Rx Store and Forward */
#define GMAC_DMA_OP_DFF                     BIT(24)    /*   */
#define GMAC_DMA_OP_RFA_2                   BIT(23)
#define GMAC_DMA_OP_RFD_2                   BIT(22)
#define GMAC_DMA_OP_TSF                     BIT(21)   /* Tx Store and Forward */
#define GMAC_DMA_OP_FTF                     BIT(20)   /* Flush Tx FIFO */
#define GMAC_DMA_OP_TTC_MASK                GENMASK(16, 14)
#define GMAC_DMA_OP_TTC(x)                  ((x) << 14)   /* Tx Threshold Control  ,• 000 64 , 001 128 , 010 192 ,011 256 ,100 40 , 101 32 , 110 24 , 111 16*/
enum
{
    GMAC_DMA_OP_TTC_64 = 0b000,
    GMAC_DMA_OP_TTC_128 = 0b001,
    GMAC_DMA_OP_TTC_192 = 0b010,
    GMAC_DMA_OP_TTC_256 = 0b011,
    GMAC_DMA_OP_TTC_40  = 0b100,
    GMAC_DMA_OP_TTC_32  = 0b101,
    GMAC_DMA_OP_TTC_24  = 0b110,
    GMAC_DMA_OP_TTC_16  = 0b111
};

#define GMAC_DMA_OP_ST                      BIT(13)   /* Start/Stop Tx */
#define GMAC_DMA_OP_RFD_MASK                GENMASK(12, 11)
#define GMAC_DMA_OP_RFD(x)                  ((x) << 11) /* Threshold for DeActive Flow Control */
#define GMAC_DMA_OP_RFA_MASK                GENMASK(10, 9) /* Threshold for Active Flow Control */
#define GMAC_DMA_OP_EFC                     BIT(8)  /* Enable HW Flow control */
#define GMAC_DMA_OP_FEF                     BIT(7)  /* Forward Error Frame */
#define GMAC_DMA_OP_FUF                     BIT(6)  /* Forward Undersize Good Frame */
#define GMAC_DMA_OP_RTC_MASK                GENMASK(4, 3)  /* Rx Threshold Control */
#define GMAC_DMA_OP_OSF                     BIT(2)  /* Operate On Second Mode */
#define GMAC_DMA_OP_SR                      BIT(1)  /* Start/Stop Rx */
#define GMAC_DMA_OP_CLEAR_MASK              ((u32)0xF8DE3F23U)
#define GMAC_DMA_OP_INIT                    (GMAC_DMA_OP_SR | GMAC_DMA_OP_RSF)

/** 中断使能寄存器 **/
#define GMAC_DMA_INTR_ENA_TIE               BIT(0) /* Transmit Interrupt */
#define GMAC_DMA_INTR_ENA_TSE               BIT(1) /* 传输停止启用 */
#define GMAC_DMA_INTR_ENA_TUE               BIT(2) /* Transmit Buffer Unavailable */
#define GMAC_DMA_INTR_ENA_THE               BIT(3) /* 发送 Jabber 超时启用 */
#define GMAC_DMA_INTR_ENA_OVE               BIT(4) /* 溢出中断使能 */
#define GMAC_DMA_INTR_ENA_UNE               BIT(5) /* 下溢中断使能 */
#define GMAC_DMA_INTR_ENA_RIE               BIT(6) /* Receive Interrupt */
#define GMAC_DMA_INTR_ENA_RUE               BIT(7) /* 接收缓冲区不可用启用 */
#define GMAC_DMA_INTR_ENA_RSE               BIT(8) /* 接收已停止启用 */
#define GMAC_DMA_INTR_ENA_RWE               BIT(9) /* 接收看门狗超时使能  */
#define GMAC_DMA_INTR_ENA_ETE               BIT(10) /* 早期发送中断使能  */
#define GMAC_DMA_INTR_ENA_FBE               BIT(13) /* Fatal Bus Error */
#define GMAC_DMA_INTR_ENA_ERE               BIT(14) /* Early Receive */
#define GMAC_DMA_INTR_ENA_AIE               BIT(15) /* Abnormal Summary */
#define GMAC_DMA_INTR_ENA_NIE               BIT(16) /* Normal Summary */

/** 丢帧和缓冲区溢出计数器寄存器 **/
#define DMA_MISSED_FRAME_CTR_CMIS           GENMASK(15, 0) //由于主机接收缓冲区不可用而导致控制器丢失的帧数
#define DMA_MISSED_FRAME_CTR_OVMIS          BIT(16)
#define DMA_MISSED_FRAME_CTR_CFIFO          GENMASK(27, 17)
#define DMA_MISSED_FRAME_CTR_OVFIFO         BIT(28)

/** 接收中断看门狗定时器寄存器 **/
#define DMA_RX_WATCHDOG_RIWT                GENMASK(7, 0)

/** AXI_BUS_MOD **/
#define DMA_AXI_BUS_MOD_UNDEF               BIT(0)  /* AXI 未定义的突发长度 */
#define DMA_AXI_BUS_MOD_BLEN4               BIT(1)  /* AXI 突发长度 4 */
#define DMA_AXI_BUS_MOD_BLEN8               BIT(2)  /* AXI 突发长度 8 */
#define DMA_AXI_BUS_MOD_BLEN16              BIT(3)  /* AXI 突发长度 16 */
#define DMA_AXI_BUS_MOD_BLEN32              BIT(4)  /* AXI 突发长度 32 */
#define DMA_AXI_BUS_MOD_BLEN64              BIT(5)  /* AXI 突发长度 64 */
#define DMA_AXI_BUS_MOD_BLEN128             BIT(6)  /* AXI 突发长度 128 */
#define DMA_AXI_BUS_MOD_BLEN256             BIT(7)  /* AXI 突发长度 256 */
#define DMA_AXI_BUS_MOD_AXI_AAL             BIT(12) /* 地址对齐的节拍 */
#define DMA_AXI_BUS_MOD_RD_OSR_LMT_MASK     GENMASK(19, 16)
#define DMA_AXI_BUS_MOD_RD_OSR_LMT(x)       ((x) << 16) /* XI 最大读取未决请求限制此值限 制 AXI 读取接口上的最大未完成请求。 */
#define DMA_AXI_BUS_MOD_WR_OSR_LMT_MASK     GENMASK(23, 20)
#define DMA_AXI_BUS_MOD_WR_OSR_LMT(x)       ((x) << 20) /* AXI 最大写入未决请求限制此值 限制 AXI 写入接口上的最大未完成请求。 */
#define DMA_AXI_BUS_MOD_UNLCK_ON_MGK_RWK    BIT(30)
#define DMA_AXI_BUS_MOD_EN_LPI              BIT(31)

#define GMAC_DMA_DESC_ADDR_MASK             GENMASK(31, 4)

/****/
enum
{
    GMAC_MAC_0 = 0,
    GMAC_MAC_1,

    GMAC_MAC_MAX
};

#define GMAC_CTRL_BASE_ADDR(pCtrl)  ((pCtrl)->config.baseAddr)
#define GMAC_DMA_BASE_ADDR(pCtrl) (GMAC_CTRL_BASE_ADDR(pCtrl) + GMAC_DMA_REG_OFFSET)

#define GMAC_READ_REG(pCtrl, regOff)            FtIn32(GMAC_CTRL_BASE_ADDR(pCtrl) + (u32)(regOff))
#define GMAC_WRITE_REG(pCtrl, regOff, regValue) FtOut32(GMAC_CTRL_BASE_ADDR(pCtrl) + (u32)(regOff), (u32)(regValue))
#define GMAC_SET_BIT(pCtrl, regOff, bit)        FtSetBit32(GMAC_CTRL_BASE_ADDR(pCtrl) + (u32)(regOff), (u32)(bit))
#define GMAC_CLR_BIT(pCtrl, regOff, bit)        FtClearBit32(GMAC_CTRL_BASE_ADDR(pCtrl) + (u32)(regOff), (u32)(bit))
#define GMAC_W1C_BIT(pCtrl, regOff, bit)        GMAC_SET_BIT(pCtrl, regOff, bit)

#ifdef __cplusplus
}
#endif

#endif // !